package code08_常用类.内部类;

/**
 * @author 黄衡熙
 * @version 1.0
 */
/*
* 成员内部类是在类里边创建的类不包裹在类的方法里边
*外部不可访问私有的
* 外部类可以访问内部类的私有的，外部类和内部类默认是一个类
* */
public class Test01_成员内部类 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        // 在非外部类中,创建内部类对象
        Outer.Inner inner = outer.new Inner();
        // 在外部调用必须通过对象调用
        outer.show();
        System.out.println("--------------------");
        inner.print();
    }
}


//外部类
class Outer {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        System.out.println("外部类方法");
        // 在外部类所在的方法中创建内部类对象
        // 正常实例化即可
        Inner inner = new Inner();
        // 本质上与调用外部类其他成员类似
        // 在类中调用可以直接调用,不需要通过对象调用
//        test();

        // 在外部类方法中如何访问内部类成员?
        // 可以正常访问,且可以访问private修饰的成员
        //相当于外部类和内部类是同一个类，因此同一个类中所有修饰符修饰的读可以访问
        System.out.println(inner.phone);//private修饰的正常访问
        System.out.println(name);
        System.out.println(inner.name);//private修饰的正常访问
        inner.print();//即使换成私有的也照样可以访问
    }

    //方法
    public void test() {
        System.out.println("这是方法");
    }

    // 成员内部类:将这个类作为外部类的一个成员
    class Inner {
        private String name = "inner";
        private String phone;

        public void print() {
            System.out.println("这是内部类的方法");
            // 在内部类中访问外部类,也可以正常访问,相当于同一个类
            // 如果存在内部类与外部类重名的属性,默认访问的是内部类的
            System.out.println("内部类name:" + name);
            Outer outer = new Outer();
            System.out.println("外部类name:" + outer.name);
            System.out.println("外部类name:" + Outer.this.name);
            System.out.println(age);
            System.out.println(phone);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }
    }
}
